Заметили, что в прошлом шаге нам приходилось каждый раз обновлять записи при перемещении. Обновлять те записи, которые не привязаны к элементам управления через DDX. Это немного напрягает. Выход опять в использовании виртуальной функции. Мы ее создадим и назовем OnUpdateSet. Эта функция будет вызываться каждый раз после вызова DDX. Ее описание:
class CDaoDialog : public CDialog
{
// Construction
public:
virtual void OnUpdateSet(); // код для обновления не связанных в диалоге записей
// вызывается при перемещении
virtual void OnSave(); // код для сохранения не связанных в диалоге записей
// вызывается при сохранении
void Last();
......
};
Пустая реализация:
void CDaoDialog::OnUpdateSet()
{
}
Вызов при каждом перемещении.
void CDaoDialog::Next()
{
SaveData();
cNavigator.OnButtonNext();
UpdateData(FALSE);
OnUpdateSet();
}
void CDaoDialog::Prev()
{
SaveData();
cNavigator.OnButtonPrev();
UpdateData(FALSE);
OnUpdateSet();
}
void CDaoDialog::First()
{
SaveData();
cNavigator.OnButtonFirst();
UpdateData(FALSE);
OnUpdateSet();
}
void CDaoDialog::Last()
{
SaveData();
cNavigator.OnButtonLast();
UpdateData(FALSE);
OnUpdateSet();
}
А вот теперь можно изменить прошлый проект. Реализовать ее.
void CAllDialog::OnUpdateSet()
{
m_Book.SetRecord(m_pSet->m_ID_BOOK);
m_Piple.SetRecord(m_pSet->m_ID_PIPLE);
}
И теперь при каждом перемещении она будет вызываться. Так, что всякие там Next, Prev нас не волнуют больше. Ну, и теперь ее же можно вызывать в OnInitDialog для начальной настройки.
BOOL CAllDialog::OnInitDialog()
{
......
OnUpdateSet(); // обновить Combo
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Еще меньше кода, еще проще и надежнее программировать. В проекте находится класс CDaoDialog упакованный для использования в Component Gallery, как ogx файл.